package design.patterns.behavioral;

/**-----
 * 责任链模式
 * 解释：
 * 责任链模式是一种行为设计模式， 允许你将请求沿着处理者链进行发送。
 * 收到请求后， 每个处理者均可对请求进行处理， 或将其传递给链上的下个处理者。
 * <p>
 * 预备知识
 * 名词：handler可以理解为处理者
 * 数据结构：链表
 * ------
 */

/**
 *  情景
 * 小明没有钱，爸爸有10元，爷爷有100元
 *
 * 小明想要买冰淇凌，爸爸钱够，爸爸买
 *               爸爸钱不够，爷爷钱够，爷爷买
 *               都不够，不买
 *
 */
public class A_ChainOfResponsibility {
    public static void main(String[] args) {
        /* 创建爸爸 */
        Person baba = new Person();
        baba.setName("爸爸");
        baba.setHasMoney(10);

        /* 创建爷爷 */
        Person yeye = new Person();
        yeye.setName("爷爷");
        yeye.setHasMoney(100);

        /* 爸爸钱不够，爷爷来付款 */
        baba.setNextHandler(yeye);

        /* 购买冰淇凌 */
        Integer iceCreamPrice = 10; // 冰淇凌价格
        System.out.println("冰淇凌价格为："+iceCreamPrice);
        baba.pay(iceCreamPrice);
        System.out.println("------");

        iceCreamPrice = 15;
        System.out.println("冰淇凌价格为："+iceCreamPrice);
        baba.pay(iceCreamPrice);
        System.out.println("------");

        iceCreamPrice = 101;
        System.out.println("冰淇凌价格为："+iceCreamPrice);
        baba.pay(iceCreamPrice);
        System.out.println("------");
    }

}

/*

 * ---
 主要有两个类，一个是Handler类，另一个是Person类
 * Handler抽象类，用来定义处理者的
 *                          姓名
 *                          剩余钱数
 *                          下一个处理者
 *                          支付函数名称
 *
 * Person类继承Handler，实现支付的逻辑

*/
abstract class Handler{

    protected String name="姓名"; // 姓名
    protected Integer hasMoney;  //有多少钱
    protected Handler nextHandler; //下一个处理者

    public void setName(String name) {//设置姓名
        this.name = name;
    }

    public void setHasMoney(Integer hasMoney) {//设置钱数
        this.hasMoney = hasMoney;
    }
    public void setNextHandler(Handler nextHandler) {//设置下一个处理者
        this.nextHandler = nextHandler;
    }


    /* 付款处理 */
    public abstract void pay(Integer money);
}

/**
 * Person 类用于创建 爸爸和爷爷
 * 并实现付款逻辑：
 *              钱够，买
 *              钱不够，看是否还有人够：
 *                              够，买
 *                              没人了，不买
 *
 */
class Person extends Handler{


    @Override
    public void pay(Integer money) {
        /* 判断钱是否足够 */
        if (money<=hasMoney){
            System.out.println(this.name+"付了钱");
        }
        else{
            //判断是否还能有人支付
            if (nextHandler!=null)
                this.nextHandler.pay(money);
            else
                System.out.println("钱不够");
        }

    }
}

